package pers.cfeng.server.dataManage.page;

import pers.cfeng.server.dataManage.pageCache.PageCache;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *  Page页操作的具体实现
 */

public class PageImpl implements Page {
    private int pageNumber;  //当前的page页号
    private byte[] data;  //页面数据
    private boolean isModified; //是否被修改
    private Lock lock;

    private PageCache pageCache; //pageCache操作方法

    //PageCache在 Page之上, 这里没有使用Spring，不存在循环依赖，因为是在PageCache中才调用
    public PageImpl(int pageNumber, byte[] data, PageCache pageCache) {
        this.pageNumber = pageNumber;
        this.data = data;
        this.pageCache = pageCache;
        lock = new ReentrantLock();

    }

    /**
     * 加锁
     */
    @Override
    public void lock() {
        lock.lock();
    }

    /**
     * 释放锁
     */
    @Override
    public void unlock() {
        lock.unlock();
    }

    /**
     * 写入db文件，这个方法在PageCache实现了，所以直接调用即可
     */
    @Override
    public void release() {
        pageCache.release(this);
    }

    @Override
    public void setModified(boolean isModified) {
        this.isModified  = isModified;
    }

    @Override
    public boolean isModified() {
        return this.isModified;
    }

    @Override
    public int getPageNumber() {
        return this.pageNumber;
    }

    @Override
    public byte[] getData() {
        return this.data;
    }
}
